﻿
#include "Engine/common.h"
#include "Engine/uimgr.h"
#include "Engine/ControlDef.h"
#include "DNF定义.h"
#include "strid.h"
#include "设置模块.h"
#include "AppUI.h"

int PageId_SelectJob;
int PageId_Setting;	
int PageId_DamageDetail;
int UI_AdjustState=0;		//初始化或调整过程中，不更新相关设置，期间触发回调函数直接返回
int CurrentJob=-1;			//当前职业，所有需要区分职业的地方均以此变量为准

void CalcCoreInit();		//计算模块入口.cpp
void CalcCoreUnInit();		//计算模块入口.cpp
void CalcCoreChangeJob(int JobIndex);	//计算模块入口.cpp

void BuildPage_SelectJob();
void BuildPage_Setting();
void BuildPage_DamageDetail();
void UIChangeJob(int JobIndex);
void InitJobUISetting();
void UninitJobUISetting();
void ApplyUserSetting();	//应用设置，重置UI状态
void ClearPageData();

void 详细构建_装备面板(int PageId,CImage* Ctrl装备面板);
void 详细构建_条件面板(int PageId,CImage* Ctrl条件面板);
void 详细构建_技能面板(int PageId,CImage* Ctrl技能面板);
void 详细构建_打造面板(int PageId,CImage* Ctrl打造面板);
void 详细构建_特性面板(int PageId,CImage* Ctrl特性面板);
void 详细构建_角色详情面板(int PageId,CImage* Ctrl角色详情面板);
void 详细构建_冷却详情面板(int PageId,CImage* Ctrl冷却详情面板);
void 详细构建_装备详情面板(int PageId,CImage* Ctrl装备详情面板);

void 重置设置_装备面板();
void 重置设置_条件面板();
void 重置设置_技能面板();
void 重置设置_打造面板();
void 重置设置_特性面板();
void 重置设置_角色详情面板();
void 重置设置_冷却详情面板();
void 重置设置_装备详情面板();

void 退出清理_装备面板();
void 退出清理_条件面板();
void 退出清理_技能面板();
void 退出清理_打造面板();
void 退出清理_特性面板();
void 退出清理_角色详情面板();
void 退出清理_冷却详情面板();
void 退出清理_装备详情面板();

void 同步提升率及格式();		//UI角色详情区.cpp
void 同步装备设置(int SettingIndex);	//UI角色详情区.cpp
void 同步装备详情();			//UI装备详情区.cpp
extern BOOL DisplayRate;	//UI角色详情区.cpp

void AppEntry()
{
	//图片加载设计的初衷是第一次加载提供所有参数，之后再加载就只需要名字
	//当然也允许每次都提供所有参数，随时用随时加载
	//但是控件SetImage后，会释放之前的Image，减少一次引用计数
	//而如果之前没有加载过，会将图片从内存中卸载
	//这导致我设置的引用计数形同虚设，不断加载和卸载图片
	//所以最终的方案是强制所有资源在开始加载一次，以后要用的时候通过名字获取

	//内存释放规则如下
	//所有资源开始都要加载一次，不保存指针，只保存名字，用到时通过LoadXXX()获取（增加引用计数）
	//程序退出时，由ResMgr的析构函数清理所有资源
	//使用SetImage()后，资源的管辖权转移到控件，由控件负责释放
	//控件创建后一般不销毁，改用Visible控制，用到控件时使用FindControl函数（不增加引用计数）
	//控件插入至UiMgr后才生效，此后由UiMgr和控件自身的析构函数负责相关内存
	//程序退出时，由UiMgr销毁所有控件，顺序是从子节点到父节点递归，然后销毁所有的页面

	//初始化DNF计算模块
	//设置模块的初始化需要装备、技能、附魔、徽章等数据，优先初始化
	CalcCoreInit();

	//初始化设置模块
	//设置数据中包含信息，指示UI模块中某些控件该如何初始化
	InitSettingDatabase();

	伤害计算结果.Init();

	//加载图像资源
	//由于设计失误，每个字符串类型的Id用之前都应该到strid.cpp里注册成int型
	//RetainAppImageRes()需要用到ResID，顺序不能错
	InitStringIdMap();
	RetainAppImageRes();

	//初步构建页面
	//分块，指定层级关系、位置、大小、样式等
	BuildPage_SelectJob();
	BuildPage_Setting();
	BuildPage_DamageDetail();

	//进一步构建页面
	//详细构建每个UI面板，设置通用的选项，设置默认的参数和背景
	//这部分放在BuildPage_XXX()里面，一般是SubBuildXXX()或XXX初始化()

	//显示初始页面（选择职业）
	UiMgr->SetDisplayPage(PageId_SelectJob);
}

void AppExit()
{
	//保存UserSetting，清理职业相关数据
	if (CurrentJob!=-1)
		UIChangeJob(-1);

	//清理各个UI面板额外分配的数据
	ClearPageData();

	//图片资源和控件在管理器的析构函数释放，无需显式处理
	//只需要清理字符串id
	UninitStringIdMap();

	伤害计算结果.Uninit();

	//清理设置模块
	UninitSettingDatabase();

	//清理DNF计算模块
	CalcCoreUnInit();
}

void UIChangeJob(int JobIndex)
{
	//点击职业后加载用户设置，返回或关闭程序时保存用户设置
	//如果LoadUserSetting()失败，将会停留在选择职业页面
	if (JobIndex==-1)
	{
		SaveUserSetting(CurrentJob);
		UI_AdjustState++;
		UninitJobUISetting();
		UI_AdjustState--;
		CalcCoreChangeJob(-1);
		CurrentJob=-1;
		UiMgr->SetDisplayPage(PageId_SelectJob);
	}
	else
	{
		CurrentJob=JobIndex;
		//计算模块先切换职业，之后的设置以新职业为准
		CalcCoreChangeJob(JobIndex);
		//加载设置，并将设置更新至计算模块
		if (!LoadUserSetting(CurrentJob))
		{
			CalcCoreChangeJob(-1);
			CurrentJob=-1;
			return ;
		}
		//根据当前设置，重置几个页面的UI
		UI_AdjustState++;
		InitJobUISetting();
		ApplyUserSetting();
		UI_AdjustState--;
		//一切准备就绪后，进行第一次计算，并将此次结果作为对比基准
		SubmitSettingChange();
		UiMgr->SetDisplayPage(PageId_Setting);
	}
}


void BuildPage_SelectJob()
{
	PageId_SelectJob=UiMgr->CreatePage();

	SetCreateControlParam(0,0,NULL,PageId_SelectJob);
	CImage* CtrlBack=EasyCreateImage(CID_选择职业_底图,WinViewWidth,WinViewHeight,RID_选择职业背景,IT_Bitmap);

	SetCreateControlParam(0,0,NULL,PageId_SelectJob);
	CLabel* CtrlHead=EasyCreateLabel(CID_选择职业_标头,WinViewWidth,20,L"首页>选择职业");
	CtrlHead->SetTextColor(0xFF000000);
	CtrlHead->SetBackColor(0x80FFFFFF);
	CtrlHead->SetPadding(3);

	SetCreateControlParam(WinViewWidth/2-(320+320+180)/2,WinViewHeight/2-200/2,NULL,PageId_SelectJob);
	CImage* CtrlJob1=EasyCreateImage(CID_选择职业_奶妈,320,200);
	CtrlJob1->SetImage(EasyLoadImageR(RID_奶妈大头像,IT_Bitmap));
	CtrlJob1->SetHoverImage(EasyLoadImageR(RID_奶妈大头像Hover,IT_Bitmap));
	CtrlJob1->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		UIChangeJob(职业_光明骑士女);
		return 0;
	});

	SetCreateControlParam(WinViewWidth/2-(320+320+180)/2+180+320,WinViewHeight/2-200/2,NULL,PageId_SelectJob);
	CImage* CtrlJob2=EasyCreateImage(CID_选择职业_剑帝,320,200);
	CtrlJob2->SetImage(EasyLoadImageR(RID_剑帝大头像,IT_Bitmap));
	CtrlJob2->SetHoverImage(EasyLoadImageR(RID_剑帝大头像Hover,IT_Bitmap));
	CtrlJob2->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		UIChangeJob(职业_流浪武士);
		return 0;
	});
}

void BuildPage_Setting()
{
	PageId_Setting=UiMgr->CreatePage();

	//底图
	SetCreateControlParam(0,0,NULL,PageId_Setting);
	CImage* Ctrl底图=EasyCreateImage(CID_底图,WinViewWidth,WinViewHeight);

	//标头
	SetCreateControlParam(标头X,标头Y,Ctrl底图,PageId_Setting);
	CLabel* Ctrl标头=EasyCreateLabel(CID_标头,标头宽度,标头高度,NULL);
	Ctrl标头->SetTextColor(0xFF000000);
	Ctrl标头->SetBackColor(0x80FFFFFF);
	Ctrl标头->SetPadding(3);

	//返回按钮
	SetCreateControlParam(返回按钮X,返回按钮Y,Ctrl底图,PageId_Setting);
	CButton* Ctrl返回按钮=EasyCreateFlatButton(CID_返回按钮,返回按钮宽度,返回按钮高度,L"返回");
	Ctrl返回按钮->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		UIChangeJob(-1);
		return 0;
	});

	//页内跳转_装备
	SetCreateControlParam(右侧信息区X-返回按钮宽度*5-滚动条宽度,0,Ctrl底图,PageId_Setting);
	CButton* Ctrl页内跳转1=EasyCreateFlatButton(CID_页内跳转_装备,返回按钮宽度,返回按钮高度,L"装备");
	Ctrl页内跳转1->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		CVScrollView* Ctrl设置区=EasyFindControl<CVScrollView>(PageId_Setting,CID_设置区);
		Ctrl设置区->SetViewPosY(装备面板标题Y);
		return 0;
	});

	//页内跳转_条件
	SetCreateControlParam(右侧信息区X-返回按钮宽度*4-滚动条宽度,0,Ctrl底图,PageId_Setting);
	CButton* Ctrl页内跳转2=EasyCreateFlatButton(CID_页内跳转_条件,返回按钮宽度,返回按钮高度,L"条件");
	Ctrl页内跳转2->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		CVScrollView* Ctrl设置区=EasyFindControl<CVScrollView>(PageId_Setting,CID_设置区);
		Ctrl设置区->SetViewPosY(条件面板标题Y);
		return 0;
	});
	
	//页内跳转_技能
	SetCreateControlParam(右侧信息区X-返回按钮宽度*3-滚动条宽度,0,Ctrl底图,PageId_Setting);
	CButton* Ctrl页内跳转3=EasyCreateFlatButton(CID_页内跳转_技能,返回按钮宽度,返回按钮高度,L"技能");
	Ctrl页内跳转3->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		CVScrollView* Ctrl设置区=EasyFindControl<CVScrollView>(PageId_Setting,CID_设置区);
		Ctrl设置区->SetViewPosY(技能面板标题Y);
		return 0;
	});

	//页内跳转_打造
	SetCreateControlParam(右侧信息区X-返回按钮宽度*2-滚动条宽度,0,Ctrl底图,PageId_Setting);
	CButton* Ctrl页内跳转4=EasyCreateFlatButton(CID_页内跳转_打造,返回按钮宽度,返回按钮高度,L"打造");
	Ctrl页内跳转4->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		CVScrollView* Ctrl设置区=EasyFindControl<CVScrollView>(PageId_Setting,CID_设置区);
		Ctrl设置区->SetViewPosY(打造面板标题Y);
		return 0;
	});

	//页内跳转_特性
	SetCreateControlParam(右侧信息区X-返回按钮宽度*1-滚动条宽度,0,Ctrl底图,PageId_Setting);
	CButton* Ctrl页内跳转5=EasyCreateFlatButton(CID_页内跳转_特性,返回按钮宽度,返回按钮高度,L"特性");
	Ctrl页内跳转5->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		CVScrollView* Ctrl设置区=EasyFindControl<CVScrollView>(PageId_Setting,CID_设置区);
		Ctrl设置区->SetViewPosY(特性面板标题Y);
		return 0;
	});


	//底图-》左侧设置区
	SetCreateControlParam(左侧设置区X,左侧设置区Y,Ctrl底图,PageId_Setting);
	CVScrollView* Ctrl设置区=EasyCreateScrollView(CID_设置区,左侧设置区宽度,左侧设置区高度,左侧设置区虚拟高度);

	//底图-》左侧设置区-》装备面板标题
	SetCreateControlParam(装备面板标题X,装备面板标题Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl装备面板标题=EasyCreateImage(CID_装备面板标题,面板标题宽度,面板标题高度,RID_装备面板标题);
	//底图-》左侧设置区-》装备面板
	SetCreateControlParam(装备面板X,装备面板Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl装备面板=EasyCreateImage(CID_装备面板,装备面板宽度,装备面板高度);
	详细构建_装备面板(PageId_Setting,Ctrl装备面板);

	//底图-》左侧设置区-》条件面板标题
	SetCreateControlParam(条件面板标题X,条件面板标题Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl条件面板标题=EasyCreateImage(CID_条件面板标题,面板标题宽度,面板标题高度,RID_条件面板标题);
	//底图-》左侧设置区-》条件面板
	SetCreateControlParam(条件面板X,条件面板Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl条件面板=EasyCreateImage(CID_条件面板,条件面板宽度,条件面板高度);
	详细构建_条件面板(PageId_Setting,Ctrl条件面板);

	//底图-》左侧设置区-》技能面板标题
	SetCreateControlParam(技能面板标题X,技能面板标题Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl技能面板标题=EasyCreateImage(CID_技能面板标题,面板标题宽度,面板标题高度,RID_技能面板标题);
	//底图-》左侧设置区-》技能面板
	SetCreateControlParam(技能面板X,技能面板Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl技能面板=EasyCreateImage(CID_技能面板,技能面板宽度,技能面板高度);
	详细构建_技能面板(PageId_Setting,Ctrl技能面板);

	//底图-》左侧设置区-》打造面板标题
	SetCreateControlParam(打造面板标题X,打造面板标题Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl打造面板标题=EasyCreateImage(CID_打造面板标题,面板标题宽度,面板标题高度,RID_打造面板标题);
	//底图-》左侧设置区-》打造面板
	SetCreateControlParam(打造面板X,打造面板Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl打造面板=EasyCreateImage(CID_打造面板,打造面板宽度,打造面板高度);
	详细构建_打造面板(PageId_Setting,Ctrl打造面板);

	//底图-》左侧设置区-》特性面板标题
	SetCreateControlParam(特性面板标题X,特性面板标题Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl特性面板标题=EasyCreateImage(CID_特性面板标题,面板标题宽度,面板标题高度,RID_特性面板标题);
	//底图-》左侧设置区-》特性面板
	SetCreateControlParam(特性面板X,特性面板Y,Ctrl设置区,PageId_Setting);
	CImage* Ctrl特性面板=EasyCreateImage(CID_特性面板,特性面板宽度,特性面板高度);
	详细构建_特性面板(PageId_Setting,Ctrl特性面板);


	//底图-》右侧信息区
	SetCreateControlParam(右侧信息区X,右侧信息区Y,Ctrl底图,PageId_Setting);
	CHTabView* Ctrl信息区=EasyCreateTabView(CID_信息区,右侧信息区宽度,右侧信息区高度);

	//底图-》右侧信息区-》角色详情面板
	CImage* Ctrl角色详情面板=new CImage(GetCtrlId(CID_角色详情面板),角色详情面板X,角色详情面板Y,角色详情面板宽度,角色详情面板高度);
	Ctrl信息区->AppendTabPage(Ctrl角色详情面板,L"角色详情");
	详细构建_角色详情面板(PageId_Setting,Ctrl角色详情面板);

	//底图-》右侧信息区-》冷却详情面板
	CImage* Ctrl冷却详情面板=new CImage(GetCtrlId(CID_冷却详情面板),冷却详情面板X,冷却详情面板Y,冷却详情面板宽度,冷却详情面板高度);
	Ctrl信息区->AppendTabPage(Ctrl冷却详情面板,L"冷却详情");
	详细构建_冷却详情面板(PageId_Setting,Ctrl冷却详情面板);

	//底图-》右侧信息区-》装备详情面板
	CImage* Ctrl装备详情面板=new CImage(GetCtrlId(CID_装备详情面板),装备详情面板X,装备详情面板Y,装备详情面板宽度,装备详情面板高度);
	Ctrl信息区->AppendTabPage(Ctrl装备详情面板,L"装备详情");
	详细构建_装备详情面板(PageId_Setting,Ctrl装备详情面板);
}


void BuildPage_DamageDetail()
{
	PageId_DamageDetail=UiMgr->CreatePage();

	//底图
	SetCreateControlParam(0,0,NULL,PageId_DamageDetail);
	CImage* Ctrl底图=EasyCreateImage(CID_伤害详情_底图,WinViewWidth,WinViewHeight);

	//标头
	SetCreateControlParam(0,0,Ctrl底图,PageId_DamageDetail);
	CLabel* Ctrl标头=EasyCreateLabel(CID_伤害详情_标头,标头宽度,标头高度,NULL);
	Ctrl标头->SetTextColor(0xFF000000);
	Ctrl标头->SetBackColor(0x80FFFFFF);
	Ctrl标头->SetPadding(3);

	//返回按钮
	SetCreateControlParam(返回按钮X,返回按钮Y,Ctrl底图,PageId_DamageDetail);
	CButton* Ctrl返回按钮=EasyCreateFlatButton(CID_伤害详情_返回按钮,返回按钮宽度,返回按钮高度,L"返回");
	Ctrl返回按钮->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
	{
		UiMgr->SetDisplayPage(PageId_Setting);
		return 0;
	});

	//角色详情面板
	//伤害详情页面的角色详情面板没有底部按钮，高度变短
	//同时伤害详情页面周围比较空旷，之前的背景不好看，换一个带边框的背景
	//不同Page的CtrlId可以重复，可以使用相同的CtrlId
	SetCreateControlParam(40,标头高度+20,Ctrl底图,PageId_DamageDetail);
	CImage* Ctrl角色详情面板=EasyCreateImage(CID_伤害详情_角色详情面板,角色详情面板宽度,角色详情面板高度_短);
	Ctrl角色详情面板->SetImage(EasyLoadImageR(RID_角色详情背景));
	详细构建_角色详情面板(PageId_DamageDetail,Ctrl角色详情面板);

	//场景(以角色详情框底边为基准)
	int BaseX=40;
	int BaseY=标头高度+20+角色详情面板高度_短;
	SetCreateControlParam(BaseX+10,BaseY+15,Ctrl底图,PageId_DamageDetail);
	CImage* Ctrl场景图标=EasyCreateImage(CID_伤害详情_场景图标,28,28);
	//图标和标签间隔10
	SetCreateControlParam(BaseX+10+28+10,BaseY+15+(28-CLineLabel::MinHeightWithBorder)/2,Ctrl底图,PageId_DamageDetail);
	CLineLabel* Ctrl系统奶标签=EasyCreateLineLabel(CID_伤害详情_系统奶标签,角色详情面板宽度/2-10-28-10-10,CLineLabel::MinHeightWithBorder,L"+21358");
	Ctrl系统奶标签->SetTextColor(0xFF4BA157);	
	Ctrl系统奶标签->SetTextBorderColor(0xFF000000);

	//怪物(以角色详情框底边中线为基准)
	BaseX=40+角色详情面板宽度/2;
	SetCreateControlParam(BaseX+10,BaseY+15,Ctrl底图,PageId_DamageDetail);
	CImage* Ctrl怪物图标=EasyCreateImage(CID_伤害详情_怪物图标,28,28);
	//图标和标签间隔10
	SetCreateControlParam(BaseX+10+28+10,BaseY+15+(28-CLineLabel::MinHeightWithBorder)/2,Ctrl底图,PageId_DamageDetail);
	CLineLabel* Ctrl怪物标签=EasyCreateLineLabel(CID_伤害详情_怪物标签,角色详情面板宽度/2-10-28-10-10,CLineLabel::MinHeightWithBorder,L"test");
	Ctrl怪物标签->SetTextColor(0xFF9F854A);
	Ctrl怪物标签->SetTextBorderColor(0xFF000000);

	//Ctrl系统奶标签->SetBorderColor(0xFF000000);
	//Ctrl怪物标签->SetBorderColor(0xFF000000);


	//伤害信息列表
	//总20行，可见15行，每行高38
	//特别注意，信息列表视图看起来带有标头，实际是背景自带的
	//角色详情面板的Y应该和背景的标头一样，而信息列表视图的Y还要再靠下一些
	SetCreateControlParam(456,标头高度+40,Ctrl底图,PageId_DamageDetail);
	CVScrollView* Ctrl信息列表视图=EasyCreateScrollView(CID_伤害详情_信息列表视图,568+16,38*15,38*20);

	//展示列表信息所需的图像和标签
	//短条宽63，长条宽126，其中的Label左右留空1像素
	int BlockPosX[7]={0,63,126,189,252,378,504};
	int BlockWidth[7]={63,63,63,63,126,126,63};
	int LineHeight=38;
	int LabelHeight=CLineLabel::MinHeight;
	for (int i=0;i<20;i++)
	{
		SetCreateControlParam(BlockPosX[0]+(BlockWidth[0]-28)/2,i*LineHeight+(LineHeight-28)/2,Ctrl信息列表视图,PageId_DamageDetail);
		CImage* Ctrl技能图标=EasyCreateImage(CID_伤害详情_技能图标+i,28,28);
		
		SetCreateControlParam(BlockPosX[1]+1,i*LineHeight+(LineHeight-LabelHeight)/2,Ctrl信息列表视图,PageId_DamageDetail);
		CLineLabel* Ctrl技能等级=EasyCreateLineLabel(CID_伤害详情_技能等级+i,BlockWidth[1]-2,LabelHeight,L"test");
		Ctrl技能等级->SetTextColor(0xFFFFFFFF);	
		Ctrl技能等级->SetAlign('-');

		SetCreateControlParam(BlockPosX[2]+1,i*LineHeight+(LineHeight-LabelHeight)/2,Ctrl信息列表视图,PageId_DamageDetail);
		CLineLabel* Ctrl技能次数=EasyCreateLineLabel(CID_伤害详情_技能次数+i,BlockWidth[2]-2,LabelHeight,L"test");
		Ctrl技能次数->SetTextColor(0xFFFFFFFF);	
		Ctrl技能次数->SetAlign('-');

		SetCreateControlParam(BlockPosX[3]+1,i*LineHeight+(LineHeight-LabelHeight)/2,Ctrl信息列表视图,PageId_DamageDetail);
		CLineLabel* Ctrl技能冷却=EasyCreateLineLabel(CID_伤害详情_技能冷却+i,BlockWidth[3]-2,LabelHeight,L"test");
		Ctrl技能冷却->SetTextColor(0xFFFFFFFF);	
		Ctrl技能冷却->SetAlign('-');

		SetCreateControlParam(BlockPosX[4]+1,i*LineHeight+(LineHeight-LabelHeight)/2,Ctrl信息列表视图,PageId_DamageDetail);
		CLineLabel* Ctrl技能平均伤害=EasyCreateLineLabel(CID_伤害详情_技能平均伤害+i,BlockWidth[4]-2,LabelHeight,L"test");
		Ctrl技能平均伤害->SetTextColor(0xFFFFFFFF);	
		Ctrl技能平均伤害->SetAlign('-');

		SetCreateControlParam(BlockPosX[5]+1,i*LineHeight+(LineHeight-LabelHeight)/2,Ctrl信息列表视图,PageId_DamageDetail);
		CLineLabel* Ctrl技能总伤害=EasyCreateLineLabel(CID_伤害详情_技能总伤害+i,BlockWidth[5]-2,LabelHeight,L"test");
		Ctrl技能总伤害->SetTextColor(0xFFFFFFFF);	
		Ctrl技能总伤害->SetAlign('-');

		SetCreateControlParam(BlockPosX[6]+1,i*LineHeight+(LineHeight-LabelHeight)/2,Ctrl信息列表视图,PageId_DamageDetail);
		CLineLabel* Ctrl技能占比=EasyCreateLineLabel(CID_伤害详情_技能占比+i,BlockWidth[6]-2,LabelHeight,L"test");
		Ctrl技能占比->SetTextColor(0xFFFFFFFF);	
		Ctrl技能占比->SetAlign('-');

		//Ctrl技能等级->SetBackColor(0x80FF0000);
		//Ctrl技能次数->SetBackColor(0x80FF0000);
		//Ctrl技能冷却->SetBackColor(0x80FF0000);
		//Ctrl技能平均伤害->SetBackColor(0x80FF0000);
		//Ctrl技能总伤害->SetBackColor(0x80FF0000);
		//Ctrl技能占比->SetBackColor(0x80FF0000);
	}

	//被动技能
	//2行，每行5个，每个宽度116，高度60
	//左右边距20，图标标签间隔10
	//标签宽116-20-28-10-20=38
	//图标宽高28，X偏移20，Y偏移16
	//标签高14，X偏移58，Y偏移23
	BaseX=458;
	BaseY=652;
	for (int i=0;i<10;i++)
	{
		SetCreateControlParam(BaseX+(i%5)*116+20,BaseY+16,Ctrl底图,PageId_DamageDetail);
		CImage* Ctrl被动技能图标=EasyCreateImage(CID_伤害详情_被动技能图标+i,28,28);

		SetCreateControlParam(BaseX+(i%5)*116+58,BaseY+23,Ctrl底图,PageId_DamageDetail);
		CLineLabel* Ctrl被动技能等级=EasyCreateLineLabel(CID_伤害详情_被动技能等级+i,38,14,L"test");
		Ctrl被动技能等级->SetTextColor(0xFFFFFFFF);	
		Ctrl被动技能等级->SetAlign('-');
		//Ctrl被动技能等级->SetBackColor(0x80FF0000);
		if (i%5==4)
			BaseY+=60;
	}
}



void InitJobUISetting()
{
	//已知的内容
	//武器，技能，白金徽章的技能部分，副武器，设置页面角色面板的人物，伤害详情页面角色面板的人物
	//称号的五一附魔，时装上衣的技能，也许还有其他特殊选项
	//技能页面的所有内容

	if (CurrentJob==职业_光明骑士女)
	{
		CImage* Ctrl底图=EasyFindControl<CImage>(PageId_Setting,CID_底图);
		Ctrl底图->SetImage(EasyLoadImageR(RID_主背景_奶妈));

		CLabel* Ctrl标头=EasyFindControl<CLabel>(PageId_Setting,CID_标头);
		Ctrl标头->SetText(L"首页>选择职业>光启·光明骑士");

		CLineLabel* Ctrl职业名=EasyFindControl<CLineLabel>(PageId_Setting,CID_角色面板职业标签);
		Ctrl职业名->SetText(职业名称文本[CurrentJob]);

		CLineLabel* Ctrl职业伤害类型=EasyFindControl<CLineLabel>(PageId_Setting,CID_角色面板伤害类型标签);
		Ctrl职业伤害类型->SetText(L"魔法固伤");

		CImage* CtrlQ版角色=EasyFindControl<CImage>(PageId_Setting,CID_角色详情_Q版角色);
		CtrlQ版角色->SetImage(EasyLoadImageR(RID_Q奶妈,IT_Animation));

		Ctrl标头=EasyFindControl<CLabel>(PageId_DamageDetail,CID_伤害详情_标头);
		Ctrl标头->SetText(L"首页>选择职业>光启·光明骑士>伤害详情");

		CtrlQ版角色=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色详情_Q版角色);//不同Page的ID可以重复
		CtrlQ版角色->SetImage(EasyLoadImageR(RID_Q奶妈,IT_Animation));

		//todo：没有隐藏标签，因为完全隐藏了空一块不好看
		CDropList* Ctrl副武器状态=EasyFindControl<CDropList>(PageId_Setting,CID_打造_副武器状态);
		Ctrl副武器状态->SetVisible(FALSE);
		CDropList* Ctrl副武器强化=EasyFindControl<CDropList>(PageId_Setting,CID_打造_副武器强化);
		Ctrl副武器强化->SetVisible(FALSE);
	}
	else if (CurrentJob==职业_流浪武士)
	{
		CImage* Ctrl底图=EasyFindControl<CImage>(PageId_Setting,CID_底图);
		Ctrl底图->SetImage(EasyLoadImageR(RID_主背景_剑帝));

		CLabel* Ctrl标头=EasyFindControl<CLabel>(PageId_Setting,CID_标头);
		Ctrl标头->SetText(L"首页>选择职业>极诣·流浪武士");

		CLineLabel* Ctrl职业名=EasyFindControl<CLineLabel>(PageId_Setting,CID_角色面板职业标签);
		Ctrl职业名->SetText(职业名称文本[CurrentJob]);

		CLineLabel* Ctrl职业伤害类型=EasyFindControl<CLineLabel>(PageId_Setting,CID_角色面板伤害类型标签);
		Ctrl职业伤害类型->SetText(L"物理百分比");

		CImage* CtrlQ版角色=EasyFindControl<CImage>(PageId_Setting,CID_角色详情_Q版角色);
		CtrlQ版角色->SetImage(EasyLoadImageR(RID_Q剑帝,IT_Animation));

		Ctrl标头=EasyFindControl<CLabel>(PageId_DamageDetail,CID_伤害详情_标头);
		Ctrl标头->SetText(L"首页>选择职业>极诣·流浪武士>伤害详情");

		CtrlQ版角色=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色详情_Q版角色);
		CtrlQ版角色->SetImage(EasyLoadImageR(RID_Q剑帝,IT_Animation));

		CDropList* Ctrl副武器状态=EasyFindControl<CDropList>(PageId_Setting,CID_打造_副武器状态);
		Ctrl副武器状态->SetVisible(TRUE);
		ResetDropList(设置_副武器状态,CID_打造_副武器状态,PageId_Setting);
		CDropList* Ctrl副武器强化=EasyFindControl<CDropList>(PageId_Setting,CID_打造_副武器强化);
		Ctrl副武器强化->SetVisible(TRUE);
		ResetDropList(设置_副武器强化,CID_打造_副武器强化,PageId_Setting);
	}
}

void UninitJobUISetting()
{
	//主要是销毁控件
}

void ApplyUserSetting()
{
	CVScrollView* Ctrl设置区=EasyFindControl<CVScrollView>(PageId_Setting,CID_设置区);
	Ctrl设置区->SetViewPosY(0);
	CHTabView* Ctrl信息区=EasyFindControl<CHTabView>(PageId_Setting,CID_信息区);
	Ctrl信息区->SetDisplayTab(0);

	重置设置_装备面板();
	重置设置_条件面板();
	重置设置_技能面板();
	重置设置_打造面板();
	重置设置_特性面板();
	重置设置_角色详情面板();
	重置设置_冷却详情面板();
	重置设置_装备详情面板();
}

void ClearPageData()
{
	退出清理_装备面板();
	退出清理_条件面板();
	退出清理_技能面板();
	退出清理_打造面板();
	退出清理_特性面板();
	退出清理_角色详情面板();
	退出清理_冷却详情面板();
	退出清理_装备详情面板();
}

void UpdateCalcResult()
{
/*
任何设置项变更以后，都会导致内容变化：
1.控件本身UI发生变化
2.与此选项相关的控件UI发生变化
3.修改设置
4.重新计算数据
5.更新角色详情面板的所有内容（包括图标）
6.更新冷却详情面板的所有内容
7.更新伤害详情页面的所有内容（含角色详情面板）
8.更新装备详情页面的条件，属性，描述

计算完成后，所有与结果有关的内容都可能发生变更，相关代码会调用此函数
以上5-7项为此函数的任务，会全部在UI上更新

第8项由 UI装备详情区.cpp 提供接口完成，包括：
更新角色详情面板的装备图标
更新装备详情面板，其中打造相关属性和条件状态与计算结果有关
如果是普通装备，显示装备描述
如果是自定义装备、巴卡尔武器贴膜、传说融合石，会出现词条选择UI

第2项存在跨面板的修改，有以下联动关系：
1.装备面板
点击已选中的装备，信息区自动跳转到装备详情面板
点击图标后，更新打造面板的部位装备图标
剩余内容在计算后完成，已在第8项说明

2.条件面板
选择场景会导致伤害详情面板的背景切换
切换怪物和场景时，会按条件禁用某些选项

3.技能面板
无联动内容

4.打造面板
修改强化类型、强化等级、锻造等级、装备徽章，
或是点击一键增幅和一键强化，会更新角色详情面板

5.特性面板
无联动内容

6.角色详情面板
点击装备图标，左侧会跳转至打造面板，并修改当前设置部位
点击伤害详情按钮，切换至伤害详情页面

7.冷却详情面板
仅展示

8.装备详情面板
无联动内容

9.伤害详情页面
仅展示
*/

	WCHAR Buf[100];
	//角色详情面板（设置页面、伤害详情页面）
	for (int i=CID_属性标签_物理攻击;i<=CID_属性标签_束缚抗性;i++)
	{
		int Index=i-CID_属性标签;
		CLineLabel* Ctrl属性标签1=EasyFindControl<CLineLabel>(PageId_Setting,i);
		CLineLabel* Ctrl属性标签2=EasyFindControl<CLineLabel>(PageId_DamageDetail,i);
		float Value=0.0f;
		if (i==CID_属性标签_属性强化)
		{
			swprintf(Buf,L"火强 %d/ 冰强 %d / 光强 %d / 暗强 %d ",(int)伤害计算结果.属性结果[伤害计算结果_t::属性强化1],(int)伤害计算结果.属性结果[伤害计算结果_t::属性强化2],
				(int)伤害计算结果.属性结果[伤害计算结果_t::属性强化3],(int)伤害计算结果.属性结果[伤害计算结果_t::属性强化4]);
		}
		else if (i==CID_属性标签_属性抗性)
		{
			swprintf(Buf,L"火抗 %d/ 冰抗 %d / 光抗 %d / 暗抗 %d ",(int)伤害计算结果.属性结果[伤害计算结果_t::属性抗性1],(int)伤害计算结果.属性结果[伤害计算结果_t::属性抗性2],
				(int)伤害计算结果.属性结果[伤害计算结果_t::属性抗性3],(int)伤害计算结果.属性结果[伤害计算结果_t::属性抗性4]);
		}
		else if (i==CID_属性标签_物理攻击 || i==CID_属性标签_魔法攻击 || i==CID_属性标签_独立攻击 || i==CID_属性标签_力量 || i==CID_属性标签_智力)
		{
			Value=伤害计算结果.属性结果[Index];
			swprintf(Buf,L"%d",(int)伤害计算结果.属性结果[Index]);
		}
		else
		{
			Value=伤害计算结果.属性结果[Index];
			swprintf(Buf,L"%.2f%%",伤害计算结果.属性结果[Index]);
		}
		Ctrl属性标签1->SetText(Buf);
		if (Value>=0)
			Ctrl属性标签1->SetTextColor(0xFF4BA157);
		else
			Ctrl属性标签1->SetTextColor(0xFFFF0000);
		Ctrl属性标签2->SetText(Buf);
		if (Value>=0)
			Ctrl属性标签2->SetTextColor(0xFF4BA157);
		else
			Ctrl属性标签2->SetTextColor(0xFFFF0000);
	}
	CLineLabel* Ctrl伤害标签1=EasyFindControl<CLineLabel>(PageId_Setting,CID_伤害标签);
	CLineLabel* Ctrl伤害标签2=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害标签);
	FormatInt64WithChineseStyle(Buf,伤害计算结果.总伤害,FALSE);
	//总伤害不可能为负数，总是绿色的
	Ctrl伤害标签1->SetText(Buf);
	Ctrl伤害标签2->SetText(Buf);
	同步提升率及格式();
	//角色详情面板的图标
	for (int i=设置_上衣;i<=设置_武器贴膜;i++)
		同步装备设置(i);

	//冷却详情面板
	for (int i=0;i<20;i++)
	{
		CImage* Ctrl技能图标=EasyFindControl<CImage>(PageId_Setting,CID_冷却_技能图标+i);
		CLineLabel* Ctrl技能原始时间=EasyFindControl<CLineLabel>(PageId_Setting,CID_冷却_技能原始时间+i);
		CLineLabel* Ctrl技能当前时间=EasyFindControl<CLineLabel>(PageId_Setting,CID_冷却_技能当前时间+i);
		CLineLabel* Ctrl技能缩减率=EasyFindControl<CLineLabel>(PageId_Setting,CID_冷却_技能缩减率+i);
		CLineLabel* Ctrl技能无色数=EasyFindControl<CLineLabel>(PageId_Setting,CID_冷却_技能无色数+i);

		if (i<伤害计算结果.技能冷却结果数)
		{
			Ctrl技能图标->SetImage(EasyLoadImageR(伤害计算结果.技能冷却结果[i].技能图标Id));

			swprintf(Buf,L"%.1fs",伤害计算结果.技能冷却结果[i].技能原始时间);
			Ctrl技能原始时间->SetText(Buf);

			/*
			if (DisplayRate)
			{
				float 减少时间=伤害计算结果.技能冷却结果[i].技能当前时间-伤害计算结果.技能冷却结果对照[i].技能当前时间;
				if (fequal(伤害计算结果.技能冷却结果对照[i].技能当前时间,0.0f))	//新增技能减少时间为0
					减少时间=0.0f;
				swprintf(Buf,L"%+.1fs",减少时间);
				Ctrl技能当前时间->SetText(Buf);
				//todo：没有设置颜色
			}
			*/

			swprintf(Buf,L"%.1fs",伤害计算结果.技能冷却结果[i].技能当前时间);
			Ctrl技能当前时间->SetText(Buf);

			swprintf(Buf,L"%.2f%%",伤害计算结果.技能冷却结果[i].技能缩减率*100.0f);
			Ctrl技能缩减率->SetText(Buf);

			swprintf(Buf,L"%d",(int)伤害计算结果.技能冷却结果[i].技能无色数);
			Ctrl技能无色数->SetText(Buf);
		}
		else
		{
			Ctrl技能图标->SetImage(NULL);
			Ctrl技能原始时间->SetText(NULL);
			Ctrl技能当前时间->SetText(NULL);
			Ctrl技能缩减率->SetText(NULL);
			Ctrl技能无色数->SetText(NULL);
		}
	}

	//伤害详情页面（系统奶，主动技能伤害，被动技能等级）
	CLineLabel* Ctrl系统奶标签=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_系统奶标签);
	swprintf(Buf,L"+%d",(int)伤害计算结果.系统奶);
	Ctrl系统奶标签->SetText(Buf);
	for (int i=0;i<20;i++)
	{
		CImage* Ctrl技能图标=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_技能图标+i);
		CLineLabel* Ctrl技能等级=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_技能等级+i);
		CLineLabel* Ctrl技能次数=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_技能次数+i);
		CLineLabel* Ctrl技能冷却=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_技能冷却+i);
		CLineLabel* Ctrl技能平均伤害=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_技能平均伤害+i);
		CLineLabel* Ctrl技能总伤害=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_技能总伤害+i);
		CLineLabel* Ctrl技能占比=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_技能占比+i);

		if (i<伤害计算结果.技能结果数)
		{
			Ctrl技能图标->SetImage(EasyLoadImageR(伤害计算结果.技能结果[i].技能图标Id));

			swprintf(Buf,L"%d",(int)伤害计算结果.技能结果[i].技能等级);
			Ctrl技能等级->SetText(Buf);

			swprintf(Buf,L"%d",(int)伤害计算结果.技能结果[i].技能次数);
			Ctrl技能次数->SetText(Buf);

			swprintf(Buf,L"%.1fs",伤害计算结果.技能结果[i].技能冷却时间);
			Ctrl技能冷却->SetText(Buf);

			/*
			if (DisplayRate)
			{
			 	double 伤害差值=伤害计算结果.技能结果[i].技能平均伤害-伤害计算结果.技能结果对照[i].技能平均伤害;
				double 伤害对照=伤害计算结果.技能结果对照[i].技能平均伤害;
				if (fequal(伤害对照,0.0f))	//新增技能显示100%提升
					伤害对照=伤害计算结果.技能结果[i].技能平均伤害;
			 	float 伤害提升率=伤害差值/伤害对照;
				swprintf(Buf,L"%+.4fs",伤害提升率);
			 	Ctrl技能平均伤害->SetText(Buf);
				//todo：没有设置颜色
			 
			 	伤害差值=伤害计算结果.技能结果[i].技能总伤害-伤害计算结果.技能结果对照[i].技能总伤害;
				伤害对照=伤害计算结果.技能结果对照[i].技能总伤害;
				if (fequal(伤害对照,0.0f))	//新增技能显示100%提升
					伤害对照=伤害计算结果.技能结果[i].技能总伤害;
			 	伤害提升率=伤害差值/伤害对照;
			 	swprintf(Buf,L"%+.4fs",伤害提升率);
				Ctrl技能总伤害->SetText(Buf);
				//todo：没有设置颜色
			}
			*/

			FormatInt64WithChineseStyle(Buf,伤害计算结果.技能结果[i].技能平均伤害,FALSE);
			Ctrl技能平均伤害->SetText(Buf);

			FormatInt64WithChineseStyle(Buf,伤害计算结果.技能结果[i].技能总伤害,FALSE);
			Ctrl技能总伤害->SetText(Buf);

			swprintf(Buf,L"%.2f%%",伤害计算结果.技能结果[i].技能占比*100.0f);
			Ctrl技能占比->SetText(Buf);
		}
		else
		{
			Ctrl技能图标->SetImage(NULL);
			Ctrl技能等级->SetText(NULL);
			Ctrl技能次数->SetText(NULL);
			Ctrl技能冷却->SetText(NULL);
			Ctrl技能平均伤害->SetText(NULL);
			Ctrl技能总伤害->SetText(NULL);
			Ctrl技能占比->SetText(NULL);
		}
	}
	for (int i=0;i<10;i++)
	{
		CImage* Ctrl技能图标=EasyFindControl<CImage>(PageId_DamageDetail,CID_伤害详情_被动技能图标+i);
		CLineLabel* Ctrl技能等级=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_伤害详情_被动技能等级+i);

		if (i<伤害计算结果.被动技能数)
		{
			Ctrl技能图标->SetImage(EasyLoadImageR(伤害计算结果.被动技能结果[i].技能图标Id));

			swprintf(Buf,L"%d级",(int)伤害计算结果.被动技能结果[i].技能等级);
			Ctrl技能等级->SetText(Buf);
		}
		else
		{
			Ctrl技能图标->SetImage(NULL);
			Ctrl技能等级->SetText(NULL);
		}
	}

	CVScrollView* Ctrl冷却列表=EasyFindControl<CVScrollView>(PageId_Setting,CID_冷却_信息列表视图);
	Ctrl冷却列表->SetViewPosY(0);
	CVScrollView* Ctrl伤害列表=EasyFindControl<CVScrollView>(PageId_DamageDetail,CID_伤害详情_信息列表视图);
	Ctrl伤害列表->SetViewPosY(0);

	//注意，装备详情页面展示的内容有一部分依赖计算结果，不会在装备面板切换装备时立即更新
	//而是等计算完成后，由相关代码回调UpdateCalcResult()，再调用 同步装备详情() 进行更新
	//和大部分面板的顺序相反
	同步装备详情();
}
